﻿<!DOCTYPE html>
<html>
<head>
    <title>Использование формул - Документация Rapid SCADA</title>
    <meta charset="utf-8" />
    <link href="../../../../css/scadadoc.min.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="../../../../lib/jquery/jquery.min.js"></script>
    <script type="text/javascript" src="../js/contents.js"></script>
    <script type="text/javascript" src="../../../../js/scadadoc.js"></script>
</head>
<body>
    <h1>Использование формул</h1>

    <p>Формулы применяются для расчёта значений и статусов входных каналов, а также для расчёта значений команд управления. Обработка формул выполняется программой Сервер.</p>

    <p>Формулы вводятся в базу конфигурации в таблицы <em>Входные каналы</em> и <em>Каналы управления</em>. Чтобы расчёт по формуле для какого-либо канала выполнялся, необходимо установить для него галочку в столбце <em>Исп. формулу</em>. Таблица <em>Формулы</em> базы конфигурации содержит дополнительные функции и структуры данных, которые могут быть использованы в формулах для входных каналов и каналов управления.</p>

    <p>Общие правила использования формул:</p>

    <ol>
        <li>Формулы записываются согласно синтаксису математических выражений языка C#. Доступны различные классы .NET, например, Math, DateTime.</li>
        <li>База конфигурации позволяет добавлять новые константы, поля, свойства и методы, которые становятся доступны в формулах.</li>
        <li>Если хотя бы одна из формул содержит ошибку, работа Сервера невозможна. Информация об ошибках в формулах выводится в журнал приложения.</li>
    </ol>

    <p>Правила формул входных каналов:</p>

    <ol>
        <li>Расчёт по формулам для каналов типа <em>Телесигнал</em> и <em>Телеизмерение</em> выполняется только при получении сервером новых данных по этим каналам. Используйте эти типы каналов, если формула не ссылается на данные других каналов.</li>
        <li>Расчёт по формулам для каналов типа <em>Дорасчётный *</em> и <em>Кол-во переключений</em> выполняется постоянно. Последовательность расчёта – от меньших номеров каналов к большим. Дорасчётные типы каналов используются, если значение и статус канала вычисляются на основе данных других каналов.</li>
        <li>Расчёт по формулам для каналов типа <em>Минутный *</em> и <em>Часовой *</em> выполняется периодически один раз в минуту или один раз в час соответственно. Используйте эти типы каналов для реализации различных счётчиков, например, потребляемой энергии или времени наработки.</li>
        <li>Статус канала после вычисления по формуле для каналов типа <em>Телесигнал</em> и <em>Телеизмерение</em> равен статусу переданных Серверу данных, если расчёт статуса не задан в формуле явно.</li>
        <li>Для каналов других типов устанавливается статус <em>Параметр определён</em>, если расчёт статуса не задан в формуле явно.</li>
        <li>Формула, заданная для входного канала в базе конфигурации и не содержащая символа &quot;;&quot;, определяет расчёт значения канала.</li>
        <li>Если формула содержит символ «;», то она разбивается на две части: первая часть определяет расчёт значения канала, вторая часть – расчёт статуса канала.</li>
    </ol>

    <p>Правила формул каналов управления:</p>

    <ol>
        <li>Формула, заданная для канала управления в базе конфигурации, применяется для каналов управления с типом команды <em>Стандартная</em> или <em>Бинарная</em>.</li>
        <li>Формула определяет расчёт значения стандартной команды и расчёт данных бинарной команды.</li>
    </ol>

    <p>Переменные, доступные в формулах:</p>

    <table class="sd-article-table">
        <tr>
            <th>Переменная</th>
            <th>Тип значения</th>
            <th>Описание</th>
        </tr>
        <tr>
            <td>CnlVal, Cnl</td>
            <td>double</td>
            <td>Передаваемое Серверу значение входного канала до расчёта</td>
        </tr>
        <tr>
            <td>CnlStat</td>
            <td>int</td>
            <td>Передаваемый Серверу статус входного канала до расчёта</td>
        </tr>
        <tr>
            <td>CmdVal, Cmd</td>
            <td>double</td>
            <td>Передаваемое Серверу значение команды управления</td>
        </tr>
        <tr>
            <td>CmdData</td>
            <td>byte[]</td>
            <td>Передаваемые Серверу данные команды управления</td>
        </tr>
        <tr>
            <td>CnlNum</td>
            <td>int</td>
            <td>Номер канала, формула которого вычисляется</td>
        </tr>
        <tr>
            <td>E</td>
            <td>double</td>
            <td>Число e</td>
        </tr>
        <tr>
            <td>PI</td>
            <td>double</td>
            <td>Число π</td>
        </tr>
    </table>

    <p>Функции, доступные в формулах:</p>

    <table class="sd-article-table">
        <tr>
            <th>Функция</th>
            <th>Тип значения</th>
            <th>Описание</th>
        </tr>
        <tr>
            <td>N(n)</td>
            <td>int</td>
            <td>Возвращает номер заданного канала для обновления номеров при клонировании</td>
        </tr>
        <tr>
            <td>Val()</td>
            <td>double</td>
            <td>Текущее значение входного канала вычисляемой формулы</td>
        </tr>
        <tr>
            <td>Val(n)</td>
            <td>double</td>
            <td>Текущее значение входного канала n</td>
        </tr>
        <tr>
            <td>SetVal(n, val)</td>
            <td>double</td>
            <td>Установить текущее значение входного канала n</td>
        </tr>
        <tr>
            <td>Stat()</td>
            <td>int</td>
            <td>Текущий статус входного канала вычисляемой формулы</td>
        </tr>
        <tr>
            <td>Stat(n)</td>
            <td>int</td>
            <td>Текущий статус входного канала n</td>
        </tr>
        <tr>
            <td>SetStat(n, stat)</td>
            <td>int</td>
            <td>Установить текущий статус входного канала n</td>
        </tr>
        <tr>
            <td>SetData(n, val, stat)</td>
            <td>double</td>
            <td>Установить текущее значение и статус входного канала n</td>
        </tr>
        <tr>
            <td>Abs(x)</td>
            <td>double</td>
            <td>Модуль</td>
        </tr>
        <tr>
            <td>Sin(x)</td>
            <td>double</td>
            <td>Синус</td>
        </tr>
        <tr>
            <td>Cos(x)</td>
            <td>double</td>
            <td>Косинус</td>
        </tr>
        <tr>
            <td>Tan(x)</td>
            <td>double</td>
            <td>Тангенс</td>
        </tr>
        <tr>
            <td>Exp(x)</td>
            <td>double</td>
            <td>Экспонента</td>
        </tr>
        <tr>
            <td>Ln(x), Log(x)</td>
            <td>double</td>
            <td>Натуральный логарифм</td>
        </tr>
        <tr>
            <td>Sqr(x)</td>
            <td>double</td>
            <td>Квадрат числа</td>
        </tr>
        <tr>
            <td>Sqrt(x)</td>
            <td>double</td>
            <td>Квадратный корень</td>
        </tr>
    </table>
</body>
</html>
